package edu.csl.study.scala.basic.demo

/**
 * 可以省略new的方法：实现伴生对象的apply方法
 */
class ApplyDemo {
  var name:String = _
  var age:Int = _

  def this(name1:String,age1:Int) ={
    this()
    this.name = name1
    this.age = age1
  }

  def hello = {
     println(s"我的名字是${this.name}，我的岁数是：${this.age}")
  }
}
/**
 * 1.objet是单例对象类
 * 2.object的变量和方法都是静态的
 * 3.main()方法是静态方法，必须写在单利对象类中
 * */
object ApplyDemo{

  // 实现apply方法
  // 返回的是伴生类的对象
  def apply(name:String, age:Int): ApplyDemo = {
    println("apply")
    new ApplyDemo(name, age)}
  // apply方法支持重载
  def apply(name:String):ApplyDemo = new ApplyDemo(name, 20)

  def apply(age:Int):ApplyDemo = new ApplyDemo("某某某", age)

  def apply():ApplyDemo = new ApplyDemo("某某某", 20)

  //提取器:是从传递给它的对象中提取出构造该对象的参数 . 如果没有这个方法，不能进行模式匹配
  def unapply(arg: ApplyDemo): Option[(String, Int)] = Some(arg.name, arg.age)

  def main(args:Array[String]):Unit = {

      //因为定义了apply方法才不需要new关键字。
      //（1）. 当遇到类名(参数1, 参数2...)会自动调用apply方法，在apply方法中来创建对象
      val applyDemo = ApplyDemo("张三",12)

      //（2）. 定义apply时，如果参数列表是空，也不能省略括号()，否则引用的是伴生对象
      val applyDemo1 = ApplyDemo()

      val applyDemo2 = new ApplyDemo("张三",12)
      applyDemo2.hello
      //模式匹配 ，匹配类
      applyDemo2 match {
        case ApplyDemo(x,y)=>  println(s"姓名：$x 年龄：$y")
        case _ =>  println("other---")
      }
   }

}